/*
 * @Description: 
 * @Author: HuRrongChao
 * @Date: 2025-01-16 13:48:55
 * @LastEditors: HuRrongChao
 * @LastEditTime: 2025-02-13 15:10:10
 */
export function callHook(hooks, name, args = []) {
  if (hooks && typeof (hooks[name] === 'function')) {
    return hooks[name].apply(null, args)
  }
  return null
}

export function warning(condition, message) {
  if (condition) return
  throw new Error(`Warning: ${message}`)
}

// 每次迭代中，调用 fn() 函数。如果 fn() 返回 false，则中断循环。
// 每次迭代后，获取当前时间 cur 并计算自开始执行以来已经过去的时间。
// 如果已经过去的时间超过了 13 毫秒（一个经验值，用于防止阻塞主线程过长时间），则更新 start 为当前时间，并使用 setTimeout(run) 安排 run 函数的下一次执行。这样做可以允许浏览器处理其他事件，从而避免界面卡顿。
export function timeSlice(len, fn) {
  let i = -1
  let start = performance.now()
  const run = () => {
    while (++i < len) {
      if (fn() === false) {
        break
      }
      const cur = performance.now()
      if (cur - start > 13) {
        start = cur
        setTimeout(run)
        break
      }
    }
  }
  run()
}

export const raf = window.requestAnimationFrame
  ? window.requestAnimationFrame.bind(window)
  : setTimeout

export function cancelAnimationFrame(id) {
  if (window.cancelAnimationFrame) {
    window.cancelAnimationFrame(id)
  } else {
    clearTimeout(id)
  }
}

export function getWidth(opts) {
  const span = document.createElement('span')
  span.innerText = opts.value
  const style = opts.style || {}
  for (const name in style) {
    span.style[name] = style[name]
  }
  span.style.position = 'absolute'
  span.style.zIndex = -1

  document.body.appendChild(span)
  let width = span.clientWidth
  let height = span.clientHeight
  document.body.removeChild(span)

  return {
    width,
    height
  }
}

export function upperCase([first, ...remaing]) {
  return first.toUpperCase() + remaing.join('')
}